////////////////////////////////////////////////////////////////////////////////////////////////////
//
#include "irrlicht.h"
#include "SpriteManager.h"
#include "Lib2D/Font.h"
#include "Sprite.h"
#include "IO/FileSystem/BinaryFile.h"

#include "irrMap.h"
#include "IFileSystem.h"
#include "IO/FileSystem/BinaryFile.h"

#include "../CGlobals.h"

using namespace irr;
using namespace core;

extern CGlobals* g;

const int SPRITE_NAME_GROUP_COUNT = 34;
static const char * g_SpriteNameGroup[SPRITE_NAME_GROUP_COUNT] =
{
	"gameloft.bsprite",
	"font_small.bsprite",
	"font_normal_white.bsprite",
	"font_normal_yellow.bsprite",
	"font_normal_red.bsprite",
	"font_outline_big.bsprite",
	"font_outline_small.bsprite",
	"font_big_jp.bsprite",
	"font_small_jp.bsprite",
	"font_big_cn.bsprite",
	"font_small_cn.bsprite",
	"mainmenu.bsprite",
	"mainmenu_bg.bsprite",
	"mainmenu_bg_ipad.bsprite",
	"level_select01.bsprite",
	"level_select02.bsprite",
	"level_select01_ipad.bsprite",
	"level_select02_ipad.bsprite",
	"interface.bsprite",
	"tutorial.bsprite",
	"transport.bsprite",
	"explosion.bsprite",
	"language.bsprite",
	"hintbb.bsprite",
	"shiyanpin.bsprite",
	"medal.bsprite",
	"loading.bsprite",
	"sfx_magic_fire_ball.bsprite",
	"boss.bsprite",
	"sfx_magic_fire_ball_core.bsprite",
	"achievement.bsprite",
	"sfx_trail_fire.bsprite",
	"keyboard.bsprite",
	"effects.bsprite"
};

////////////////////////////////////////////////////////////////////////////////////////////////////
//
CSpriteManager::CSpriteManager()
{

}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
CSpriteManager::~CSpriteManager()
{
	UnloadAll();
}

void CSpriteManager::UnloadAll()
{
	map<int, CSprite *>::Iterator it;
	it = m_pSpriteMap.getIterator();

	while ( !it.atEnd() )
	{
		CSprite* spr =(it->getValue());
		SAFE_DEL(spr);
		it++;
	}

	m_pSpriteMap.clear();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
int CSpriteManager::LoadSprite(const char *spriteFile, bool bFont,bool bLinear)
{
	if ( !FindSpriteByName(spriteFile) ) 
	{
		CSprite *pSpr;

		/*if (bFont)
		{
			CFont *pFont = new CFont();			
			pSpr = pFont;
		}
		else*/
		{
			pSpr = new CSprite();
		}

		if( !bLinear )
		{
			//pSpr->SetFilterType(irr::video::ETFT_NEAREST);
		}

		CBinaryFile* file = (CBinaryFile*)g->device->getFileSystem()->createAndOpenFile(spriteFile);
		ASSERT(file);
		//if (!file )
		//{
		//	LOG("global", "File not found %s !!!\n" , spriteFile);
		//	return -1;
		//}
		
		s32 res = pSpr->LoadSprite(file);
		
		if (res < 0 )
		{
			//LOG("global", "Load Sprite failed !!!\n");
			return -3;
		}
		
		file->drop();

		m_pSpriteMap[GetSpriteFlag(spriteFile)] = pSpr;	
	}
	
	return 1;
}

CSprite* CSpriteManager::GetSprite(const char *spriteFile)
{
	if( spriteFile == NULL )
	{
		ASSERT(0);
		return NULL;
	}

	int flag = GetSpriteFlag( spriteFile );
	irr::core::map<int, CSprite *>::Node *pNode = m_pSpriteMap.find( flag );
	if( pNode )
	{
		return pNode->getValue();
	}
	return NULL;	
}

bool CSpriteManager::FindSpriteByName(const char *pName)
{
	int flag = GetSpriteFlag( pName );
	irr::core::map<int, CSprite *>::Node *pNode = m_pSpriteMap.find( flag );
	if( pNode )
	{
		return true;		
	}
	return false;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
//
void CSpriteManager::UnloadSprite(const char *spriteFile)
{
	if( spriteFile == NULL )
	{
		return;
	}
	CSprite* spr = GetSprite(spriteFile);
	if( spr )
	{
		int flag = GetSpriteFlag( spriteFile );
		irr::core::map<int, CSprite *>::Node *pNode = m_pSpriteMap.find( flag );
		if( pNode )
		{
			//m_pSpriteMap.remove( pNode );
		}
		
		SAFE_DEL(spr);
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//CFont* CSpriteManager::GetFont(const char *spriteFile)
//{
//	if( spriteFile == NULL )
//	{
//		ASSERT(0);
//		return NULL;
//	}
//
//	const char * pFontName = Application::instance()->GetFontName(spriteFile );
//	if( pFontName )
//	{
//		CSprite* pSprite = GetSprite(pFontName);
//		if( pSprite )
//		{
//			return (CFont*)pSprite;
//		}
//	}
//	ASSERT(0);
//	return NULL;
//}
////////////////////////////////////////////////////////////////////////////////////////////////////

int CSpriteManager::GetSpriteFlag( const char *pName )
{
	if( pName == NULL )
	{
		ASSERT(0);
		return 0;
	}

	for(int i=0;i<SPRITE_NAME_GROUP_COUNT;i++)
	{
		if( stricmp( g_SpriteNameGroup[i] ,pName ) == 0 )
		{
			return i;
		}
	}
	ASSERT(0);
	return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
